package main

import (
	"fmt"
)

// 通过实现 Error 方法来自定义 error 类型是可以的。这里使用自定义错误类型来表示上面的参数错误。

type argError struct {
    arg  int
    prob string
}

func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.prob)
}


func f2(arg int) (int, error) {
	if (42 == arg) {
		return -1, &argError{arg, "can't work with it"}
	}
	return arg + 3, nil
}


func main(){
	var ele int = 0
	for _, ele = range []int{7,42} {
		r, e := f2(ele)
		if (nil == e) {
			fmt.Println("f2 worked:", r)
		} else {
			fmt.Println("f2 failed:", e)
		}
	}

	_, e := f2(42)
	// 推断 e 的类型是不是 argError
	if ae, ok := e.(*argError); ok {
        fmt.Println(ae.arg)
		fmt.Println(ae.prob)
		fmt.Println(ok)
	}
	
}
